#!/bin/bash

# SmartInput 服务停止脚本
# 一键停止所有服务：WebSocket服务器 + 移动端PWA应用

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# PID文件路径
PIDS_DIR="$PROJECT_ROOT/.pids"
SERVER_PID_FILE="$PIDS_DIR/server.pid"
MOBILE_PID_FILE="$PIDS_DIR/mobile.pid"
ADMIN_PID_FILE="$PIDS_DIR/admin.pid"

# 打印带颜色的消息
print_message() {
    local color=$1
    local message=$2
    echo -e "${color}${message}${NC}"
}

# 停止进程
stop_process() {
    local pid_file=$1
    local service_name=$2
    
    if [ ! -f "$pid_file" ]; then
        print_message $YELLOW "⚠️  $service_name PID文件不存在: $pid_file"
        return 0
    fi
    
    local pid=$(cat "$pid_file")
    
    if [ -z "$pid" ]; then
        print_message $YELLOW "⚠️  $service_name PID文件为空"
        rm -f "$pid_file"
        return 0
    fi
    
    # 检查进程是否存在
    if ! kill -0 "$pid" 2>/dev/null; then
        print_message $YELLOW "⚠️  $service_name 进程不存在 (PID: $pid)"
        rm -f "$pid_file"
        return 0
    fi
    
    print_message $BLUE "🛑 停止 $service_name (PID: $pid)..."
    
    # 尝试优雅停止
    if kill -TERM "$pid" 2>/dev/null; then
        # 等待进程结束
        local count=0
        while kill -0 "$pid" 2>/dev/null && [ $count -lt 10 ]; do
            sleep 1
            count=$((count + 1))
            echo -n "."
        done
        echo ""
        
        # 如果进程仍在运行，强制停止
        if kill -0 "$pid" 2>/dev/null; then
            print_message $YELLOW "⚠️  进程未响应，强制停止..."
            kill -KILL "$pid" 2>/dev/null || true
            sleep 1
        fi
        
        # 再次检查进程是否已停止
        if ! kill -0 "$pid" 2>/dev/null; then
            print_message $GREEN "✅ $service_name 已停止"
            rm -f "$pid_file"
        else
            print_message $RED "❌ 无法停止 $service_name"
            return 1
        fi
    else
        print_message $RED "❌ 无法发送停止信号给 $service_name"
        return 1
    fi
}

# 通过端口停止进程
stop_by_port() {
    local port=$1
    local service_name=$2
    
    print_message $BLUE "🔍 检查端口 $port 上的进程..."
    
    # 查找占用端口的进程
    local pids=$(lsof -ti :$port 2>/dev/null || true)
    
    if [ -z "$pids" ]; then
        print_message $YELLOW "⚠️  端口 $port 没有被占用"
        return 0
    fi
    
    print_message $BLUE "🛑 停止端口 $port 上的 $service_name 进程..."
    
    for pid in $pids; do
        if kill -0 "$pid" 2>/dev/null; then
            print_message $BLUE "   停止进程 PID: $pid"
            kill -TERM "$pid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
        fi
    done
    
    # 等待端口释放
    local count=0
    while lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1 && [ $count -lt 5 ]; do
        sleep 1
        count=$((count + 1))
        echo -n "."
    done
    echo ""
    
    if ! lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
        print_message $GREEN "✅ 端口 $port 已释放"
    else
        print_message $YELLOW "⚠️  端口 $port 可能仍被占用"
    fi
}

# 清理相关进程
cleanup_processes() {
    print_message $BLUE "🧹 清理相关进程..."
    
    # 停止所有相关的node进程
    pkill -f "node.*dist/index.js" 2>/dev/null || true
    pkill -f "vite.*--port" 2>/dev/null || true
    pkill -f "npm.*start" 2>/dev/null || true
    pkill -f "npm.*dev" 2>/dev/null || true
    
    sleep 2
    print_message $GREEN "✅ 进程清理完成"
}

# 主函数
main() {
    print_message $GREEN "🛑 SmartInput 服务停止脚本"
    print_message $BLUE "================================"
    
    # 停止WebSocket服务器
    print_message $BLUE "🖥️  停止 WebSocket 服务器..."
    stop_process "$SERVER_PID_FILE" "WebSocket服务器"
    
    # 停止移动端应用
    print_message $BLUE "📱 停止移动端应用..."
    stop_process "$MOBILE_PID_FILE" "移动端应用"
    
    # 停止管理后台应用
    print_message $BLUE "🛠️  停止管理后台应用..."
    stop_process "$ADMIN_PID_FILE" "管理后台应用"
    
    # 通过端口停止可能遗留的进程
    stop_by_port 3001 "WebSocket服务器"
    stop_by_port 3000 "移动端应用"
    stop_by_port 3002 "管理后台应用"
    
    # 清理相关进程
    cleanup_processes
    
    # 清理PID目录
    if [ -d "$PIDS_DIR" ]; then
        rm -rf "$PIDS_DIR"
        print_message $GREEN "✅ 清理PID文件"
    fi
    
    print_message $BLUE "================================"
    print_message $GREEN "🎉 所有服务已停止！"
    print_message $BLUE ""
    print_message $BLUE "🛠️  管理命令:"
    print_message $BLUE "   启动服务: ./start.sh"
    print_message $BLUE "   重启服务: ./restart.sh"
    print_message $BLUE "   查看状态: ./status.sh"
}

# 执行主函数
main "$@"
